package bank_access;

import java.util.logging.Logger;

/**
 * @author Mariusz, Pascal
 */
public class KontoProxy extends KontoImplBase {

    private Kommunikationsmodul kommModul;
    private Logger logger;

    public KontoProxy(String host, int port) {
        logger = Kommunikationsmodul.getLogger();
        kommModul = new Kommunikationsmodul(host, port);
    }

    @Override
    public double abheben(double betrag) throws KontoException {
        final String message = "CALL#ABHEBEN#" + betrag + "#**\n";
        String[] reply = kommModul.send(message).split("#");
        if (reply[1].startsWith("bank_access.KontoException")) {
            throw new KontoException(reply[1].split(": ")[1]); //gib den Fehler zur�ck -> siehe Protokoll ERR .... ** Fehlernachricht
        }
        try {
            return Double.valueOf(reply[1]);
        } catch (NumberFormatException e) {
            logger.severe("EXCEPTION " + e);
        }
        return Double.NaN;
    }

    @Override
    public double einzahlen(double betrag) throws KontoException {
        final String message = "CALL#EINZAHLEN#" + betrag + "#**\n";
        String[] reply = kommModul.send(message).split("#");
        if (reply[1].startsWith("bank_access.KontoException")) {
            throw new KontoException(reply[1].split(": ")[1]); //gib den Fehler zur�ck -> siehe Protokoll ERROR .... ** Fehlernachricht
        }
        try {
            return Double.valueOf(reply[1]);
        } catch (NumberFormatException e) {
            logger.severe("EXCEPTION " + e);
        }
        return Double.NaN;
    }

    @Override
    public double kontoStand() {
        String message = "CALL#KONTOSTAND#**\n";
        String[] reply = kommModul.send(message).split("#");
        logger.info("Antwort: " + reply[0] + " " + reply[1]);
        try {
            if (reply[0].equalsIgnoreCase("OK")) {
                return Double.valueOf(reply[1]);
            } else {
                logger.info("Fehler beim Lesen des Kontostandes");
            }

        } catch (NumberFormatException e) {
            logger.info("EXCEPTION " + e);
        }
        return Double.NaN;
    }

    @Override
    public double ueberweise(double betrag, String bankleitzahl,
            String empfaengerKontoID) throws KontoException {

        String message = "CALL#UEBERWEISEN#" + bankleitzahl + "#" + empfaengerKontoID + "#" + betrag + "#" + "**\n";
        String[] reply = kommModul.send(message).split("#");
        try {
            if (reply[0].equalsIgnoreCase("OK")) {
                return Double.valueOf(reply[1]);
            } else {
                logger.info(reply[1]);
            }
        } catch (NumberFormatException e) {
            logger.info("EXCEPTION " + e);
        }
        return Double.NaN;
    }
}
